#ifndef INTERRUPTMANAGER_H
#define INTERRUPTMANAGER_H

#include <QObject>
#include <QMap>
#include <QList>
#include <memory>

// 前向声明
class CpuSimulator;
class SystemCallHandler;
struct SystemCallResult;

/**
 * @brief 中断管理器类
 * 
 * 负责管理和分发所有系统中断调用，包括文件操作、输入输出、
 * 字符串处理、数学运算、系统信息等各类中断处理器。
 */
class InterruptManager : public QObject
{
    Q_OBJECT

public:
    explicit InterruptManager(QObject *parent = nullptr);
    ~InterruptManager() override;

    /**
     * @brief 处理中断调用
     * @param interruptNumber 中断号
     * @param cpu CPU模拟器指针
     * @return SystemCallResult 处理结果
     */
    SystemCallResult handleInterrupt(int interruptNumber, CpuSimulator* cpu);

    /**
     * @brief 重置所有处理器状态
     */
    void reset();

    /**
     * @brief 获取中断调用统计信息
     * @return QMap<int, int> 中断号到调用次数的映射
     */
    QMap<int, int> getInterruptStatistics() const;

    /**
     * @brief 获取支持的中断号列表
     * @return QList<int> 支持的中断号列表
     */
    QList<int> getSupportedInterrupts() const;

    /**
     * @brief 设置调试模式
     * @param enabled 是否启用调试模式
     */
    void setDebugMode(bool enabled);

    /**
     * @brief 检查中断号是否受支持
     * @param interruptNumber 中断号
     * @return bool 是否支持
     */
    bool isInterruptSupported(int interruptNumber) const;

    /**
     * @brief 获取中断描述信息
     * @param interruptNumber 中断号
     * @return QString 中断描述
     */
    QString getInterruptDescription(int interruptNumber) const;

    /**
     * @brief 清空中断统计信息
     */
    void clearStatistics();

    /**
     * @brief 获取最常用的中断号
     * @param count 返回的数量
     * @return QList<QPair<int, int>> 中断号和调用次数的配对列表，按调用次数降序排列
     */
    QList<QPair<int, int>> getMostUsedInterrupts(int count = 10) const;

private:
    /**
     * @brief 初始化中断处理器
     */
    void initializeHandlers();

    /**
     * @brief 根据中断号获取对应的处理器
     * @param interruptNumber 中断号
     * @return SystemCallHandler* 处理器指针，nullptr表示不支持
     */
    SystemCallHandler* getHandlerForInterrupt(int interruptNumber) const;

private slots:
    /**
     * @brief 处理中断完成槽函数
     * @param interruptNumber 中断号
     * @param result 处理结果
     */
    void onInterruptHandled(int interruptNumber, const SystemCallResult& result);

signals:
    /**
     * @brief 中断处理完成信号
     * @param interruptNumber 中断号
     * @param result 处理结果
     */
    void interruptHandled(int interruptNumber, const SystemCallResult& result);

    /**
     * @brief 错误发生信号
     * @param interruptNumber 中断号
     * @param errorMessage 错误信息
     */
    void errorOccurred(int interruptNumber, const QString& errorMessage);

    /**
     * @brief 输出信息信号
     * @param message 输出信息
     */
    void outputMessage(const QString& message);

    /**
     * @brief 重置完成信号
     */
    void resetCompleted();

private:
    // 中断处理器实例
    std::unique_ptr<SystemCallHandler> fileSystemHandler;    // 文件系统处理器
    std::unique_ptr<SystemCallHandler> inputOutputHandler;   // 输入输出处理器
    std::unique_ptr<SystemCallHandler> mathHandler;          // 数学运算处理器
    std::unique_ptr<SystemCallHandler> stringHandler;        // 字符串处理器
    std::unique_ptr<SystemCallHandler> systemInfoHandler;    // 系统信息处理器

    // 统计和配置
    QMap<int, int> interruptStatistics;                      // 中断调用统计
    bool debugMode;                                           // 调试模式标志
};

#endif // INTERRUPTMANAGER_H 